﻿#include <iostream>
#include <future>
#include <chrono>
#include <thread>
#include <Windows.h>  // Windows 平台专用
// 模拟一个“文件下载”任务（假设需要 3 秒）
int downloadFile() {
    std::cout << "开始下载文件..." << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(3));  // 模拟下载耗时
    std::cout << "文件下载完成！" << std::endl;
    return 100;  // 返回下载了 100MB
}
int main() {
    // 设置控制台输出为 UTF-8 编码，防止中文乱码（Windows 特有）
    SetConsoleOutputCP(65001);
    // 异步启动下载任务
    std::future<int> download_result = std::async(std::launch::async, downloadFile);
    // 主线程做其他事，比如显示等待动画
    for (int i = 0; i < 6; ++i) {
        std::cout << "主线程：等待中 " << std::string(i % 3 + 1, '.') << "\r" << std::flush;
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
    }
    // 获取下载结果（会等待任务完成）
    int size = download_result.get();
    std::cout << "\n下载的文件大小为: " << size << " MB" << std::endl;
    return 0;
}

/*
 * 你有一个 UI 程序或主控制逻辑，它要在后台下载一个大文件，
 * 同时主线程要继续响应用户（比如打印动画、提示语等）。这个时候就非常适合用 std::async 来异步处理耗时任务！
 * | 组成部分              | 说明                       |
| ----------------- | ------------------------ |
| `downloadFile`    | 耗时的模拟下载函数                |
| `std::async(...)` | 异步启动下载任务，函数在后台线程中执行      |
| `future.get()`    | 等待并获取任务的返回值              |
| 主线程动画循环           | 模拟主线程还在忙其他事（UI提示、打印、动画等） |
 *
 *
 * 类似真实用途还包括：
 * 异步加载游戏地图或贴图资源（不阻塞主线程）
 * 异步执行图像识别或机器学习模型推理
 * 异步发起数据库查询 / HTTP 请求
 * 后台备份或写文件（日志系统）
 *
 *
 * */
